package com.algorithm.ch1.lzr.string;


/**
 * 字符串转整数
 * <p>
 * 在找到第一个非空字符之前, 需要移除掉字符串中的空格字符
 * 如果第一个非空字符是正号或负号, 选取该符号, 并将其与后面尽可能多的连续的数字组合起来, 这部分字符即为整数的值
 * 如果第一个非空字符是数字，则直接将其与之后连续的数字字符组合起来, 形成整数
 * <p>
 * 字符串可以在形成整数的字符后面包括多余的字符，这些字符可以被忽略，它们对于函数没有影响。
 * 当字符串中的第一个非空字符序列不是个有效的整数; 或字符串为空; 或字符串仅包含空白字符时, 则不进行转换
 *
 * @author lzr
 * @date 2018/8/13
 */
public class MyAtoi {

    public static void main(String[] args) {
        int a = -2 << 30;
        System.out.println(a);
        int b = (2 << 30) - 1;
        System.out.println(b);

        //String s = "          -03211319513131a";
        String s = "-91283472332";
        int i = myAtoi(s);
        System.out.println(i);


    }

    /**
     * 找到第一个非空字符, 然后找出连续的, 获取一段连续的可以转成整数的字符串
     * 第一个非空字符需为'-','+',数字
     *
     * @param s
     * @return
     */
    public static int myAtoi(String s) {
        if(isBlank(s)){
            return 0;
        }
        StringBuilder sb = new StringBuilder();
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            //对应空格数据则不处理
            if (Character.isWhitespace(chars[i]) && isBlank(sb.toString())) {
                continue;
            }
            //如果存在非空字符
            if (chars[i] >= '0' && chars[i] <= '9' || isBlank(sb.toString()) && (chars[i] == '+' || chars[i] == '-')) {
                sb.append(chars[i]);
            } else {
                break;
            }
        }
        if (!isBlank(sb.toString())) {
            if (sb.toString().length() == 1 && ("+".equals(sb.toString()) || "-".equals(sb.substring(0, 1)))) {
                return 0;
            }
            if ("-".equals(sb.substring(0, 1))) {
                try {
                    return Integer.valueOf(sb.toString());
                } catch (Exception e) {
                    return -2 << 30;
                }
            } else {
                try {
                    return Integer.valueOf(sb.toString());
                } catch (Exception e) {
                    return (2 << 30) - 1;
                }
            }
        } else {
            return 0;
        }
    }

    public static boolean isBlank(String s) {
        if (s == null || s.length() == 0) {
            return true;
        }
        for (int i = 0; i < s.length(); i++) {
            if ((Character.isWhitespace(s.charAt(i)) == false)) {
                return false;
            }
        }
        return true;
    }


}
